ngl: Set color as vertex attribute
authorMatthias Clasen <mclasen@redhat.com>
Fri, 12 Mar 2021 00:46:15 +0000 (19:46 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 12 Mar 2021 18:18:47 +0000 (13:18 -0500)
Instead of using uniforms for color used in multiple
programs, pass it as vertex attributes. This will let
us batch more draw calls, since we don't have to change
uniforms so often. In particular, for syntax-highlighted
text.

20 files changed:
gsk/ngl/gsknglcommandqueue.c
gsk/ngl/gskngldriver.c
gsk/ngl/gskngldriverprivate.h
gsk/ngl/gsknglprograms.defs
gsk/ngl/gsknglrenderjob.c
gsk/ngl/gskngltypesprivate.h
gsk/ngl/resources/blend.glsl
gsk/ngl/resources/blit.glsl
gsk/ngl/resources/border.glsl
gsk/ngl/resources/color.glsl
gsk/ngl/resources/color_matrix.glsl
gsk/ngl/resources/coloring.glsl
gsk/ngl/resources/conic_gradient.glsl
gsk/ngl/resources/cross_fade.glsl
gsk/ngl/resources/inset_shadow.glsl
gsk/ngl/resources/outset_shadow.glsl
gsk/ngl/resources/preamble.fs.glsl
gsk/ngl/resources/preamble.vs.glsl
gsk/ngl/resources/repeat.glsl
gsk/ngl/resources/unblurred_outset_shadow.glsl

index 9426c199b1468dc279d3c21a68abc911f39b8fc8..7d5a8b30be52e8c68ece3f23fe392a1c34fab190 100644 (file)
@@ -1096,6 +1096,12 @@ gsk_ngl_command_queue_execute (GskNglCommandQueue   *self,
                          sizeof (GskNglDrawVertex),
                          (void *) G_STRUCT_OFFSET (GskNglDrawVertex, uv));
 
+  /* 2 = color location */
+  glEnableVertexAttribArray (2);
+  glVertexAttribPointer (2, 4, GL_FLOAT, GL_FALSE,
+                         sizeof (GskNglDrawVertex),
+                         (void *) G_STRUCT_OFFSET (GskNglDrawVertex, color));
+
   /* Setup initial scissor clip */
   if (scissor != NULL)
     {
index 1b00b135ed05a431679bfd2516e7848001c2d852..3d910e5d51dcfc43ad7ebf776aac0335f99a9baf 100644 (file)
@@ -347,6 +347,7 @@ gsk_ngl_driver_load_programs (GskNglDriver  *self,
   /* Setup attributes that are provided via VBO */
   gsk_ngl_compiler_bind_attribute (compiler, "aPosition", 0);
   gsk_ngl_compiler_bind_attribute (compiler, "aUv", 1);
+  gsk_ngl_compiler_bind_attribute (compiler, "aColor", 2);
 
   /* Use XMacros to register all of our programs and their uniforms */
 #define GSK_NGL_NO_UNIFORMS
@@ -376,7 +377,6 @@ gsk_ngl_driver_load_programs (GskNglDriver  *self,
     uniforms                                                                                     \
                                                                                                  \
     gsk_ngl_program_uniforms_added (program, have_source);                                       \
-                                                                                                 \
     if (have_alpha)                                                                              \
       gsk_ngl_program_set_uniform1f (program, UNIFORM_SHARED_ALPHA, 0, 1.0f);                    \
                                                                                                  \
@@ -1045,6 +1045,7 @@ gsk_ngl_driver_lookup_shader (GskNglDriver  *self,
       /* Setup attributes that are provided via VBO */
       gsk_ngl_compiler_bind_attribute (compiler, "aPosition", 0);
       gsk_ngl_compiler_bind_attribute (compiler, "aUv", 1);
+      gsk_ngl_compiler_bind_attribute (compiler, "aColor", 2);
 
       if ((program = gsk_ngl_compiler_compile (compiler, NULL, "", error)))
         {
index 28199ec0166d5292419206f5e428c9757ac9e879..c50e112e862690be16d5b9e3409f64f47184ae07 100644 (file)
@@ -58,13 +58,17 @@ typedef struct {
   graphene_rect_t parent_rect; /* Valid when pointer_is_child */
 } GskTextureKey;
 
-#define GSL_GK_NO_UNIFORMS UNIFORM_INVALID_##__COUNTER__
+#define GSK_NGL_NO_UNIFORMS CONCAT_EXPANDED(UNIFORM_INVALID_,__COUNTER__)
+#define CONCAT_EXPANDED(a,b) CONCAT_EXPANDED2(a,b)
+#define CONCAT_EXPANDED2(a,b) a##b
 #define GSK_NGL_ADD_UNIFORM(pos, KEY, name) UNIFORM_##KEY = UNIFORM_SHARED_LAST + pos,
 #define GSK_NGL_DEFINE_PROGRAM(name, resource, uniforms) enum { uniforms };
 # include "gsknglprograms.defs"
 #undef GSK_NGL_DEFINE_PROGRAM
 #undef GSK_NGL_ADD_UNIFORM
-#undef GSL_GK_NO_UNIFORMS
+#undef GSK_NGL_NO_UNIFORMS
+#undef CONCAT_EXPANDED
+#undef CONCAT_EXPANDED2
 
 #define GSK_TYPE_NGL_DRIVER (gsk_ngl_driver_get_type())
 
index 85c9366ad6488d30c12527e0b6be85b08517a9d6..e20cca2fa99716a5c99b6fd2d13b8fd95086c397 100644 (file)
@@ -15,17 +15,16 @@ GSK_NGL_DEFINE_PROGRAM (blur,
 
 GSK_NGL_DEFINE_PROGRAM (border,
                         "/org/gtk/libgsk/ngl/border.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, BORDER_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, BORDER_WIDTHS, u_widths)
                         GSK_NGL_ADD_UNIFORM (3, BORDER_OUTLINE_RECT, u_outline_rect))
 
 GSK_NGL_DEFINE_PROGRAM (color,
                         "/org/gtk/libgsk/ngl/color.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, COLOR_COLOR, u_color))
+                        GSK_NGL_NO_UNIFORMS)
 
 GSK_NGL_DEFINE_PROGRAM (coloring,
                         "/org/gtk/libgsk/ngl/coloring.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, COLORING_COLOR, u_color))
+                        GSK_NGL_NO_UNIFORMS)
 
 GSK_NGL_DEFINE_PROGRAM (color_matrix,
                         "/org/gtk/libgsk/ngl/color_matrix.glsl",
@@ -45,7 +44,6 @@ GSK_NGL_DEFINE_PROGRAM (cross_fade,
 
 GSK_NGL_DEFINE_PROGRAM (inset_shadow,
                         "/org/gtk/libgsk/ngl/inset_shadow.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, INSET_SHADOW_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, INSET_SHADOW_SPREAD, u_spread)
                         GSK_NGL_ADD_UNIFORM (3, INSET_SHADOW_OFFSET, u_offset)
                         GSK_NGL_ADD_UNIFORM (4, INSET_SHADOW_OUTLINE_RECT, u_outline_rect))
@@ -59,7 +57,6 @@ GSK_NGL_DEFINE_PROGRAM (linear_gradient,
 
 GSK_NGL_DEFINE_PROGRAM (outset_shadow,
                         "/org/gtk/libgsk/ngl/outset_shadow.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, OUTSET_SHADOW_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, OUTSET_SHADOW_OUTLINE_RECT, u_outline_rect))
 
 GSK_NGL_DEFINE_PROGRAM (radial_gradient,
@@ -77,7 +74,6 @@ GSK_NGL_DEFINE_PROGRAM (repeat,
 
 GSK_NGL_DEFINE_PROGRAM (unblurred_outset_shadow,
                         "/org/gtk/libgsk/ngl/unblurred_outset_shadow.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, UNBLURRED_OUTSET_SHADOW_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, UNBLURRED_OUTSET_SHADOW_SPREAD, u_spread)
                         GSK_NGL_ADD_UNIFORM (3, UNBLURRED_OUTSET_SHADOW_OFFSET, u_offset)
                         GSK_NGL_ADD_UNIFORM (4, UNBLURRED_OUTSET_SHADOW_OUTLINE_RECT, u_outline_rect))
index 93ca180133cfeb10199a50b456252c7617df7cf8..14e3b3e42b80d36168401029224b740648659e3e 100644 (file)
@@ -142,6 +142,9 @@ struct _GskNglRenderJob
   /* Our current alpha state as we process nodes */
   float alpha;
 
+  /* Our current color state as we process nodes */
+  GdkRGBA color;
+
   /* Offset (delta x,y) as we process nodes. Occasionally this is merged into
    * a transform that is referenced from child transform nodes.
    */
@@ -395,6 +398,13 @@ gsk_ngl_render_job_set_alpha (GskNglRenderJob *job,
   return alpha;
 }
 
+static inline void
+gsk_ngl_render_job_set_color (GskNglRenderJob *job,
+                              const GdkRGBA   *color)
+{
+  job->color = *color;
+}
+
 static void
 extract_matrix_metadata (GskNglRenderModelview *modelview)
 {
@@ -874,49 +884,91 @@ gsk_ngl_render_job_update_clip (GskNglRenderJob     *job,
   return TRUE;
 }
 
-/* load_vertex_data_with_region */
-static inline void
-gsk_ngl_render_job_load_vertices_from_offscreen (GskNglRenderJob             *job,
-                                                 const graphene_rect_t       *bounds,
-                                                 const GskNglRenderOffscreen *offscreen)
+/* fill_vertex_data */
+static void
+gsk_ngl_render_job_draw_coords (GskNglRenderJob *job,
+                                float            min_x,
+                                float            min_y,
+                                float            max_x,
+                                float            max_y,
+                                float            min_u,
+                                float            min_v,
+                                float            max_u,
+                                float            max_v)
 {
   GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-  float min_x = job->offset_x + bounds->origin.x;
-  float min_y = job->offset_y + bounds->origin.y;
-  float max_x = min_x + bounds->size.width;
-  float max_y = min_y + bounds->size.height;
-  float y1 = offscreen->was_offscreen ? offscreen->area.y2 : offscreen->area.y;
-  float y2 = offscreen->was_offscreen ? offscreen->area.y : offscreen->area.y2;
 
   vertices[0].position[0] = min_x;
   vertices[0].position[1] = min_y;
-  vertices[0].uv[0] = offscreen->area.x;
-  vertices[0].uv[1] = y1;
+  vertices[0].uv[0] = min_u;
+  vertices[0].uv[1] = min_v;
+  vertices[0].color[0] = job->color.red;
+  vertices[0].color[1] = job->color.green;
+  vertices[0].color[2] = job->color.blue;
+  vertices[0].color[3] = job->color.alpha;
 
   vertices[1].position[0] = min_x;
   vertices[1].position[1] = max_y;
-  vertices[1].uv[0] = offscreen->area.x;
-  vertices[1].uv[1] = y2;
+  vertices[1].uv[0] = min_u;
+  vertices[1].uv[1] = max_v;
+  vertices[1].color[0] = job->color.red;
+  vertices[1].color[1] = job->color.green;
+  vertices[1].color[2] = job->color.blue;
+  vertices[1].color[3] = job->color.alpha;
 
   vertices[2].position[0] = max_x;
   vertices[2].position[1] = min_y;
-  vertices[2].uv[0] = offscreen->area.x2;
-  vertices[2].uv[1] = y1;
+  vertices[2].uv[0] = max_u;
+  vertices[2].uv[1] = min_v;
+  vertices[2].color[0] = job->color.red;
+  vertices[2].color[1] = job->color.green;
+  vertices[2].color[2] = job->color.blue;
+  vertices[2].color[3] = job->color.alpha;
 
   vertices[3].position[0] = max_x;
   vertices[3].position[1] = max_y;
-  vertices[3].uv[0] = offscreen->area.x2;
-  vertices[3].uv[1] = y2;
+  vertices[3].uv[0] = max_u;
+  vertices[3].uv[1] = max_v;
+  vertices[3].color[0] = job->color.red;
+  vertices[3].color[1] = job->color.green;
+  vertices[3].color[2] = job->color.blue;
+  vertices[3].color[3] = job->color.alpha;
 
   vertices[4].position[0] = min_x;
   vertices[4].position[1] = max_y;
-  vertices[4].uv[0] = offscreen->area.x;
-  vertices[4].uv[1] = y2;
+  vertices[4].uv[0] = min_u;
+  vertices[4].uv[1] = max_v;
+  vertices[4].color[0] = job->color.red;
+  vertices[4].color[1] = job->color.green;
+  vertices[4].color[2] = job->color.blue;
+  vertices[4].color[3] = job->color.alpha;
 
   vertices[5].position[0] = max_x;
   vertices[5].position[1] = min_y;
-  vertices[5].uv[0] = offscreen->area.x2;
-  vertices[5].uv[1] = y1;
+  vertices[5].uv[0] = max_u;
+  vertices[5].uv[1] = min_v;
+  vertices[5].color[0] = job->color.red;
+  vertices[5].color[1] = job->color.green;
+  vertices[5].color[2] = job->color.blue;
+  vertices[5].color[3] = job->color.alpha;
+}
+
+/* load_vertex_data_with_region */
+static inline void
+gsk_ngl_render_job_load_vertices_from_offscreen (GskNglRenderJob             *job,
+                                                 const graphene_rect_t       *bounds,
+                                                 const GskNglRenderOffscreen *offscreen)
+{
+  float min_x = job->offset_x + bounds->origin.x;
+  float min_y = job->offset_y + bounds->origin.y;
+  float max_x = min_x + bounds->size.width;
+  float max_y = min_y + bounds->size.height;
+  float y1 = offscreen->was_offscreen ? offscreen->area.y2 : offscreen->area.y;
+  float y2 = offscreen->was_offscreen ? offscreen->area.y : offscreen->area.y2;
+
+  gsk_ngl_render_job_draw_coords (job,
+                                  min_x, min_y, max_x, max_y,
+                                  offscreen->area.x, y1, offscreen->area.x2, y2);
 }
 
 /* load_float_vertex_data */
@@ -927,41 +979,12 @@ gsk_ngl_render_job_draw (GskNglRenderJob *job,
                          float            width,
                          float            height)
 {
-  GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
   float min_x = job->offset_x + x;
   float min_y = job->offset_y + y;
   float max_x = min_x + width;
   float max_y = min_y + height;
 
-  vertices[0].position[0] = min_x;
-  vertices[0].position[1] = min_y;
-  vertices[0].uv[0] = 0;
-  vertices[0].uv[1] = 0;
-
-  vertices[1].position[0] = min_x;
-  vertices[1].position[1] = max_y;
-  vertices[1].uv[0] = 0;
-  vertices[1].uv[1] = 1;
-
-  vertices[2].position[0] = max_x;
-  vertices[2].position[1] = min_y;
-  vertices[2].uv[0] = 1;
-  vertices[2].uv[1] = 0;
-
-  vertices[3].position[0] = max_x;
-  vertices[3].position[1] = max_y;
-  vertices[3].uv[0] = 1;
-  vertices[3].uv[1] = 1;
-
-  vertices[4].position[0] = min_x;
-  vertices[4].position[1] = max_y;
-  vertices[4].uv[0] = 0;
-  vertices[4].uv[1] = 1;
-
-  vertices[5].position[0] = max_x;
-  vertices[5].position[1] = min_y;
-  vertices[5].uv[0] = 1;
-  vertices[5].uv[1] = 0;
+  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y, 0, 0, 1, 1);
 }
 
 /* load_vertex_data */
@@ -976,47 +999,6 @@ gsk_ngl_render_job_draw_rect (GskNglRenderJob       *job,
                            bounds->size.height);
 }
 
-/* fill_vertex_data */
-static void
-gsk_ngl_render_job_draw_coords (GskNglRenderJob *job,
-                                float            min_x,
-                                float            min_y,
-                                float            max_x,
-                                float            max_y)
-{
-  GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-
-  vertices[0].position[0] = min_x;
-  vertices[0].position[1] = min_y;
-  vertices[0].uv[0] = 0;
-  vertices[0].uv[1] = 1;
-
-  vertices[1].position[0] = min_x;
-  vertices[1].position[1] = max_y;
-  vertices[1].uv[0] = 0;
-  vertices[1].uv[1] = 0;
-
-  vertices[2].position[0] = max_x;
-  vertices[2].position[1] = min_y;
-  vertices[2].uv[0] = 1;
-  vertices[2].uv[1] = 1;
-
-  vertices[3].position[0] = max_x;
-  vertices[3].position[1] = max_y;
-  vertices[3].uv[0] = 1;
-  vertices[3].uv[1] = 0;
-
-  vertices[4].position[0] = min_x;
-  vertices[4].position[1] = max_y;
-  vertices[4].uv[0] = 0;
-  vertices[4].uv[1] = 0;
-
-  vertices[5].position[0] = max_x;
-  vertices[5].position[1] = min_y;
-  vertices[5].uv[0] = 1;
-  vertices[5].uv[1] = 1;
-}
-
 /* load_offscreen_vertex_data */
 static inline void
 gsk_ngl_render_job_draw_offscreen_rect (GskNglRenderJob       *job,
@@ -1027,7 +1009,7 @@ gsk_ngl_render_job_draw_offscreen_rect (GskNglRenderJob       *job,
   float max_x = min_x + bounds->size.width;
   float max_y = min_y + bounds->size.height;
 
-  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y);
+  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y, 0, 1, 1, 0);
 }
 
 static inline void
@@ -1283,7 +1265,7 @@ blur_offscreen (GskNglRenderJob       *job,
   gsk_ngl_program_set_uniform2f (job->current_program,
                                  UNIFORM_BLUR_DIR, 0,
                                  1, 0);
-  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height);
+  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height, 0, 1, 1, 0);
   gsk_ngl_render_job_end_draw (job);
 
   /* Bind second pass framebuffer and clear it */
@@ -1307,7 +1289,7 @@ blur_offscreen (GskNglRenderJob       *job,
   gsk_ngl_program_set_uniform2f (job->current_program,
                                  UNIFORM_BLUR_DIR, 0,
                                  0, 1);
-  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height);
+  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height, 0, 1, 1, 0);
   gsk_ngl_render_job_end_draw (job);
 
   gsk_ngl_render_job_pop_modelview (job);
@@ -1381,9 +1363,7 @@ gsk_ngl_render_job_visit_color_node (GskNglRenderJob     *job,
                                      const GskRenderNode *node)
 {
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_COLOR_COLOR, 0,
-                                     gsk_color_node_get_color (node));
+  gsk_ngl_render_job_set_color (job, gsk_color_node_get_color (node));
   gsk_ngl_render_job_draw_rect (job, &node->bounds);
   gsk_ngl_render_job_end_draw (job);
 }
@@ -1694,9 +1674,7 @@ gsk_ngl_render_job_visit_rect_border_node (GskNglRenderJob     *job,
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
 
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_COLOR_COLOR, 0,
-                                     &colors[0]);
+  gsk_ngl_render_job_set_color (job, &colors[0]);
 
   gsk_ngl_render_job_draw_rect (job,
       &GRAPHENE_RECT_INIT (origin->x,
@@ -1737,12 +1715,10 @@ gsk_ngl_render_job_visit_uniform_border_node (GskNglRenderJob     *job,
   gsk_ngl_render_job_transform_rounded_rect (job, rounded_outline, &outline);
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, inset_shadow));
+  gsk_ngl_render_job_set_color (job, &colors[0]);
   gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                             UNIFORM_INSET_SHADOW_OUTLINE_RECT, 0,
                                             &outline);
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_INSET_SHADOW_COLOR, 0,
-                                     &colors[0]);
   gsk_ngl_program_set_uniform1f (job->current_program,
                                  UNIFORM_INSET_SHADOW_SPREAD, 0,
                                  widths[0]);
@@ -1758,7 +1734,7 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob     *job,
                                       const GskRenderNode *node)
 {
   const GskRoundedRect *rounded_outline = gsk_border_node_get_outline (node);
-  const GdkRGBA *colors = gsk_border_node_get_colors (node);
+  const GdkRGBA *c = gsk_border_node_get_colors (node);
   const float *widths = gsk_border_node_get_widths (node);
   struct {
     float w;
@@ -1818,52 +1794,48 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob     *job,
     const GskNglDrawVertex side_data[4][6] = {
       /* Top */
       {
-        { { min_x,              min_y              }, { 0, 1 }, }, /* Upper left */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { min_x,              min_y              }, { 0, 1 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } }, /* Upper left */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } }, /* Upper right */
 
-        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 1, 0 }, }, /* Lower right */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 1, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } }, /* Lower right */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue, c[0].alpha } }, /* Upper right */
       },
       /* Right */
       {
-        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, }, /* Upper left */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } }, /* Upper left */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } }, /* Upper right */
 
-        { { max_x,              max_y              }, { 1, 0 }, }, /* Lower right */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { max_x,              max_y              }, { 1, 0 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } }, /* Lower right */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue, c[1].alpha } }, /* Upper right */
       },
       /* Bottom */
       {
-        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, }, /* Upper left */
-        { { min_x,              max_y              }, { 0, 0 }, }, /* Lower left */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, }, /* Upper right */
+        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } }, /* Upper left */
+        { { min_x,              max_y              }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } }, /* Lower left */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } }, /* Upper right */
 
-        { { max_x,              max_y              }, { 1, 0 }, }, /* Lower right */
-        { { min_x            ,  max_y              }, { 0, 0 }, }, /* Lower left */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, }, /* Upper right */
+        { { max_x,              max_y              }, { 1, 0 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } }, /* Lower right */
+        { { min_x            ,  max_y              }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } }, /* Lower left */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue, c[2].alpha } }, /* Upper right */
       },
       /* Left */
       {
-        { { min_x,              min_y              }, { 0, 1 }, }, /* Upper left */
-        { { min_x,              max_y              }, { 0, 0 }, }, /* Lower left */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, }, /* Upper right */
+        { { min_x,              min_y              }, { 0, 1 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } }, /* Upper left */
+        { { min_x,              max_y              }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } }, /* Lower left */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } }, /* Upper right */
 
-        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 1, 0 }, }, /* Lower right */
-        { { min_x,              max_y              }, { 0, 0 }, }, /* Lower left */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, }, /* Upper right */
+        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 1, 0 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } }, /* Lower right */
+        { { min_x,              max_y              }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } }, /* Lower left */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue, c[3].alpha } }, /* Upper right */
       }
     };
-    int indices[4] = { 0, 1, 2, 3 };
     GskRoundedRect outline;
     GskNglProgram *program;
 
-    /* We sort them by color */
-    sort_border_sides (colors, indices);
-
     /* Prepare outline */
     gsk_ngl_render_job_transform_rounded_rect (job, rounded_outline, &outline);
 
@@ -1881,16 +1853,12 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob     *job,
       {
         GskNglDrawVertex *vertices;
 
-        if (widths[indices[i]] <= 0)
+        if (widths[i] <= 0)
           continue;
 
         gsk_ngl_render_job_begin_draw (job, program);
-        gsk_ngl_program_set_uniform4fv (job->current_program,
-                                        UNIFORM_BORDER_COLOR, 0,
-                                        1,
-                                        (const float *)&colors[indices[i]]);
         vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-        memcpy (vertices, side_data[indices[i]], sizeof (GskNglDrawVertex) * GSK_NGL_N_VERTICES);
+        memcpy (vertices, side_data[i], sizeof (GskNglDrawVertex) * GSK_NGL_N_VERTICES);
         gsk_ngl_render_job_end_draw (job);
       }
   }
@@ -2019,12 +1987,10 @@ gsk_ngl_render_job_visit_unblurred_inset_shadow_node (GskNglRenderJob     *job,
   gsk_ngl_render_job_transform_rounded_rect (job, outline, &transformed_outline);
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, inset_shadow));
+  gsk_ngl_render_job_set_color (job, gsk_inset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                             UNIFORM_INSET_SHADOW_OUTLINE_RECT, 0,
                                             &transformed_outline);
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_INSET_SHADOW_COLOR, 0,
-                                     gsk_inset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform1f (job->current_program,
                                  UNIFORM_INSET_SHADOW_SPREAD, 0,
                                  gsk_inset_shadow_node_get_spread (node));
@@ -2122,12 +2088,10 @@ gsk_ngl_render_job_visit_blurred_inset_shadow_node (GskNglRenderJob     *job,
 
       /* Actual inset shadow outline drawing */
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, inset_shadow));
+      gsk_ngl_render_job_set_color (job, gsk_inset_shadow_node_get_color (node));
       gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                                 UNIFORM_INSET_SHADOW_OUTLINE_RECT, 0,
                                                 &transformed_outline);
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_INSET_SHADOW_COLOR, 0,
-                                         gsk_inset_shadow_node_get_color (node));
       gsk_ngl_program_set_uniform1f (job->current_program,
                                      UNIFORM_INSET_SHADOW_SPREAD, 0,
                                      spread * MAX (scale_x, scale_y));
@@ -2231,12 +2195,10 @@ gsk_ngl_render_job_visit_unblurred_outset_shadow_node (GskNglRenderJob     *job,
   gsk_ngl_render_job_transform_rounded_rect (job, outline, &transformed_outline);
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, unblurred_outset_shadow));
+  gsk_ngl_render_job_set_color (job, gsk_outset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                             UNIFORM_UNBLURRED_OUTSET_SHADOW_OUTLINE_RECT, 0,
                                             &transformed_outline);
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_UNBLURRED_OUTSET_SHADOW_COLOR, 0,
-                                     gsk_outset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform1f (job->current_program,
                                  UNIFORM_UNBLURRED_OUTSET_SHADOW_SPREAD, 0,
                                  spread);
@@ -2387,9 +2349,7 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob     *job,
 
       /* Draw the outline using color program */
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_COLOR_COLOR, 0,
-                                         &white);
+      gsk_ngl_render_job_set_color (job, &white);
       gsk_ngl_render_job_draw (job, 0, 0, texture_width, texture_height);
       gsk_ngl_render_job_end_draw (job);
 
@@ -2433,9 +2393,7 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob     *job,
       init_full_texture_region (&offscreen);
 
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, outset_shadow));
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_OUTSET_SHADOW_COLOR, 0,
-                                         color);
+      gsk_ngl_render_job_set_color (job, color);
       gsk_ngl_program_set_uniform_texture (job->current_program,
                                            UNIFORM_SHARED_SOURCE, 0,
                                            GL_TEXTURE_2D,
@@ -2456,9 +2414,7 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob     *job,
     }
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, outset_shadow));
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_OUTSET_SHADOW_COLOR, 0,
-                                     color);
+  gsk_ngl_render_job_set_color (job, color);
   gsk_ngl_program_set_uniform_texture (job->current_program,
                                        UNIFORM_SHARED_SOURCE, 0,
                                        GL_TEXTURE_2D,
@@ -2753,14 +2709,9 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob     *job,
 
   /* If the font has color glyphs, we don't need to recolor anything */
   if (!force_color && gsk_text_node_has_color_glyphs (node))
-    {
-      program = CHOOSE_PROGRAM (job, blit);
-    }
+    program = CHOOSE_PROGRAM (job, blit);
   else
-    {
-      program = CHOOSE_PROGRAM (job, coloring);
-      gsk_ngl_program_set_uniform_color (program, UNIFORM_COLORING_COLOR, 0, color);
-    }
+    program = CHOOSE_PROGRAM (job, coloring);
 
   lookup.font = (PangoFont *)font;
   lookup.scale = (guint) (text_scale * 1024);
@@ -2835,31 +2786,55 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob     *job,
       vertices[base+0].position[1] = glyph_y;
       vertices[base+0].uv[0] = tx;
       vertices[base+0].uv[1] = ty;
+      vertices[base+0].color[0] = color->red;
+      vertices[base+0].color[1] = color->green;
+      vertices[base+0].color[2] = color->blue;
+      vertices[base+0].color[3] = color->alpha;
 
       vertices[base+1].position[0] = glyph_x;
       vertices[base+1].position[1] = glyph_y2;
       vertices[base+1].uv[0] = tx;
       vertices[base+1].uv[1] = ty2;
+      vertices[base+1].color[0] = color->red;
+      vertices[base+1].color[1] = color->green;
+      vertices[base+1].color[2] = color->blue;
+      vertices[base+1].color[3] = color->alpha;
 
       vertices[base+2].position[0] = glyph_x2;
       vertices[base+2].position[1] = glyph_y;
       vertices[base+2].uv[0] = tx2;
       vertices[base+2].uv[1] = ty;
+      vertices[base+2].color[0] = color->red;
+      vertices[base+2].color[1] = color->green;
+      vertices[base+2].color[2] = color->blue;
+      vertices[base+2].color[3] = color->alpha;
 
       vertices[base+3].position[0] = glyph_x2;
       vertices[base+3].position[1] = glyph_y2;
       vertices[base+3].uv[0] = tx2;
       vertices[base+3].uv[1] = ty2;
+      vertices[base+3].color[0] = color->red;
+      vertices[base+3].color[1] = color->green;
+      vertices[base+3].color[2] = color->blue;
+      vertices[base+3].color[3] = color->alpha;
 
       vertices[base+4].position[0] = glyph_x;
       vertices[base+4].position[1] = glyph_y2;
       vertices[base+4].uv[0] = tx;
       vertices[base+4].uv[1] = ty2;
+      vertices[base+4].color[0] = color->red;
+      vertices[base+4].color[1] = color->green;
+      vertices[base+4].color[2] = color->blue;
+      vertices[base+4].color[3] = color->alpha;
 
       vertices[base+5].position[0] = glyph_x2;
       vertices[base+5].position[1] = glyph_y;
       vertices[base+5].uv[0] = tx2;
       vertices[base+5].uv[1] = ty;
+      vertices[base+5].color[0] = color->red;
+      vertices[base+5].color[1] = color->green;
+      vertices[base+5].color[2] = color->blue;
+      vertices[base+5].color[3] = color->alpha;
 
       batch->draw.vbo_count += GSK_NGL_N_VERTICES;
       used++;
@@ -2952,14 +2927,12 @@ gsk_ngl_render_job_visit_shadow_node (GskNglRenderJob     *job,
 
       gsk_ngl_render_job_offset (job, dx, dy);
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, coloring));
+      gsk_ngl_render_job_set_color (job, &shadow->color);
       gsk_ngl_program_set_uniform_texture (job->current_program,
                                            UNIFORM_SHARED_SOURCE, 0,
                                            GL_TEXTURE_2D,
                                            GL_TEXTURE0,
                                            offscreen.texture_id);
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_COLORING_COLOR, 0,
-                                         &shadow->color);
       gsk_ngl_render_job_load_vertices_from_offscreen (job, &bounds, &offscreen);
       gsk_ngl_render_job_end_draw (job);
       gsk_ngl_render_job_offset (job, -dx, -dy);
@@ -3014,7 +2987,7 @@ gsk_ngl_render_job_visit_blur_node (GskNglRenderJob     *job,
                                        GL_TEXTURE_2D,
                                        GL_TEXTURE0,
                                        offscreen.texture_id);
-  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y);
+  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y, 0, 1, 1, 0);
   gsk_ngl_render_job_end_draw (job);
 }
 
@@ -3123,9 +3096,7 @@ gsk_ngl_render_job_visit_gl_shader_node_fallback (GskNglRenderJob     *job,
   static const GdkRGBA pink = { 255 / 255., 105 / 255., 180 / 255., 1.0 };
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_COLOR_COLOR, 0,
-                                     &pink);
+  gsk_ngl_render_job_set_color (job, &pink);
   gsk_ngl_render_job_draw_rect (job, &node->bounds);
   gsk_ngl_render_job_end_draw (job);
 }
@@ -3317,7 +3288,6 @@ gsk_ngl_render_job_visit_texture_node (GskNglRenderJob     *job,
 
       for (guint i = 0; i < n_slices; i ++)
         {
-          GskNglDrawVertex *vertices;
           const GskNglTextureSlice *slice = &slices[i];
           float x1, x2, y1, y2;
 
@@ -3333,37 +3303,8 @@ gsk_ngl_render_job_visit_texture_node (GskNglRenderJob     *job,
                                                GL_TEXTURE_2D,
                                                GL_TEXTURE0,
                                                slice->texture_id);
-          vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-
-          vertices[0].position[0] = x1;
-          vertices[0].position[1] = y1;
-          vertices[0].uv[0] = 0;
-          vertices[0].uv[1] = 0;
-
-          vertices[1].position[0] = x1;
-          vertices[1].position[1] = y2;
-          vertices[1].uv[0] = 0;
-          vertices[1].uv[1] = 1;
-
-          vertices[2].position[0] = x2;
-          vertices[2].position[1] = y1;
-          vertices[2].uv[0] = 1;
-          vertices[2].uv[1] = 0;
-
-          vertices[3].position[0] = x2;
-          vertices[3].position[1] = y2;
-          vertices[3].uv[0] = 1;
-          vertices[3].uv[1] = 1;
-
-          vertices[4].position[0] = x1;
-          vertices[4].position[1] = y2;
-          vertices[4].uv[0] = 0;
-          vertices[4].uv[1] = 1;
-
-          vertices[5].position[0] = x2;
-          vertices[5].position[1] = y1;
-          vertices[5].uv[0] = 1;
-          vertices[5].uv[1] = 0;
+
+          gsk_ngl_render_job_draw_coords (job, x1, y1, x2, y2, 0, 0, 1, 1);
         }
 
       gsk_ngl_render_job_end_draw (job);
@@ -3900,6 +3841,7 @@ gsk_ngl_render_job_new (GskNglDriver          *driver,
   job->viewport = *viewport;
 
   gsk_ngl_render_job_set_alpha (job, 1.0);
+  gsk_ngl_render_job_set_color (job, &(GdkRGBA){ 0.f, 0.f, 0.f, 0.f });
   gsk_ngl_render_job_set_projection_from_rect (job, viewport, NULL);
   gsk_ngl_render_job_set_modelview (job, gsk_transform_scale (NULL, scale_factor, scale_factor));
 
index aba6f2f4c973e514a108f4e5573c432088d862b6..dc76fb41f4904945bd7ce0b1b3347992e1324a81 100644 (file)
@@ -55,6 +55,7 @@ struct _GskNglDrawVertex
 {
   float position[2];
   float uv[2];
+  float color[4];
 };
 
 G_END_DECLS
index 22323402ac2ad878a703bfe4bfcb58f7934c6b41..51670f8b78487dd748113fec6016f48bfcc7a8aa 100644 (file)
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
index f01cd238ec3c4a5eac29ccd57b70694a6a313638..93416bc6a46fa4c6c6e598040dad11350c76aaf2 100644 (file)
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
index 677a0df7cd8a2f803faaa014c090182e1bdc0401..997aeab3dae3553cc096158188c422f22e2046e9 100644 (file)
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform vec4 u_widths;
 uniform vec4[3] u_outline_rect;
 
@@ -10,7 +9,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect outside = gsk_create_rect(u_outline_rect);
   GskRoundedRect inside = gsk_rounded_rect_shrink (outside, u_widths);
index 636456ce0dd553abe231eaf86b7bbe30a22abcd9..5d2370bdf564e57336b34f03ff50ba7bbd5689c9 100644 (file)
@@ -1,12 +1,10 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
-
 _OUT_ vec4 final_color;
 
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 }
 
 // FRAGMENT_SHADER:
index 79cb36434ea2459e8ef343126171ac53d1b5663f..06e645b6051d5bffcd3674463f3281b76818faaf 100644 (file)
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
index a675493030587fb66bc4c0358e01ac1f551e6c5d..b6af0c1766b7d281569515a4edbdad28363dd205 100644 (file)
@@ -1,6 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
-
 _OUT_ vec4 final_color;
 
 void main() {
@@ -8,7 +6,7 @@ void main() {
 
   vUv = vec2(aUv.x, aUv.y);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 }
 
 // FRAGMENT_SHADER:
index 630a42c5e6cdc01316138b3ac9f6c6e12cc6bd7f..48a1cf7149807ec8e71cb4aae40994654d4fe281 100644 (file)
@@ -10,8 +10,7 @@ void main() {
   vec2 mv1 = u_modelview[1].xy;
   vec2 offset = aPosition - u_geometry.xy;
 
-  coord = vec2(dot(mv0, offset),
-               dot(mv1, offset));
+  coord = vec2(dot(mv0, offset), dot(mv1, offset));
 }
 
 // FRAGMENT_SHADER:
index f824430f9d2a83eb8f77d342c980a045cfa031e9..dddc44fdd0e8832dadeccda462c964e669d3689a 100644 (file)
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
index 9a21cdef097fb4d3d6ae4edbc5fec59cbd77d173..aae2f2ebef30356156542e8e331adbe8bc43f969 100644 (file)
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform float u_spread;
 uniform vec2 u_offset;
 uniform vec4[3] u_outline_rect;
@@ -11,7 +10,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect outside = gsk_create_rect(u_outline_rect);
   GskRoundedRect inside = gsk_rounded_rect_shrink(outside, vec4(u_spread));
index 373c6501794d3afc387b71122ae67ca10d262ee8..e8a802e49472590649d22e74d55e60c603d6b18b 100644 (file)
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform vec4[3] u_outline_rect;
 
 _OUT_ vec4 final_color;
@@ -10,7 +9,7 @@ void main() {
 
   vUv = vec2(aUv.x, aUv.y);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect outline = gsk_create_rect(u_outline_rect);
   gsk_rounded_rect_transform(outline, u_modelview);
index 3a2fe492404f9dd637a625b1e6b0a77fcee46f1e..e715d2526d5b52aab54506649533b1225c9822bb 100644 (file)
@@ -1,7 +1,7 @@
 uniform sampler2D u_source;
 uniform mat4 u_projection;
 uniform mat4 u_modelview;
-uniform float u_alpha;// = 1.0;
+uniform float u_alpha;
 uniform vec4 u_viewport;
 uniform vec4[3] u_clip_rect;
 
@@ -14,7 +14,6 @@ _OUT_ vec4 outputColor;
 _IN_ vec2 vUv;
 
 
-
 GskRoundedRect gsk_decode_rect(_GSK_ROUNDED_RECT_UNIFORM_ r)
 {
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
index 89ee6f74e0f8cc4e2336a7dae9aee5546304950f..a549ff6ded9288781a959e56402e8deeef0a7a04 100644 (file)
@@ -5,10 +5,12 @@ uniform float u_alpha;
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
 attribute vec2 aPosition;
 attribute vec2 aUv;
+attribute vec4 aColor;
 _OUT_ vec2 vUv;
 #else
 _IN_ vec2 aPosition;
 _IN_ vec2 aUv;
+_IN_ vec4 aColor;
 _OUT_ vec2 vUv;
 #endif
 
index a9ebcc5e1048e246d77bb5260f8ce37d1f460ab9..654446c70f07578ca777f236750ac6c0be4e8922 100644 (file)
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
@@ -9,7 +10,6 @@ void main() {
 uniform vec4 u_child_bounds;
 uniform vec4 u_texture_rect;
 
-
 float wrap(float f, float wrap_for) {
   return mod(f, wrap_for);
 }
index f110370412ce9c138f9d9aab3c86bc118d8f941d..56f0750e6d0a15bc3f5b80b996d1628ef83768db 100644 (file)
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform float u_spread;
 uniform vec2 u_offset;
 uniform vec4[3] u_outline_rect;
@@ -11,7 +10,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect inside = gsk_create_rect(u_outline_rect);
   GskRoundedRect outside = gsk_rounded_rect_shrink(inside, vec4(- u_spread));